//package cn.lingyangwl.agile.gateway.filter;
//
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.cloud.gateway.filter.GatewayFilter;
//import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
//import org.springframework.http.codec.HttpMessageReader;
//import org.springframework.web.reactive.function.server.HandlerStrategies;
//
//import java.util.List;
//
///**
// * 密码解密工具类
// * @author shenguangyang
// */
//@Slf4j
//@RequiredArgsConstructor
//public class PasswordDecoderFilter extends AbstractGatewayFilterFactory {
//
//	private static final List<HttpMessageReader<?>> messageReaders = HandlerStrategies.withDefaults().messageReaders();
//
//	private static final String PASSWORD = "password";
//
//	private static final String KEY_ALGORITHM = "AES";
//
//	@Override
//	public GatewayFilter apply(Object config) {
//		return (exchange, chain) -> {
////			ServerHttpRequest request = exchange.getRequest();
////			// 1. 不是登录请求，直接向下执行
////			if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), SecurityConstants.OAUTH_TOKEN_URL)) {
////				return chain.filter(exchange);
////			}
////
////			// 2. 刷新token类型，直接向下执行
////			String grantType = request.getQueryParams().getFirst("grant_type");
////			if (StrUtil.equals(SecurityConstants.REFRESH_TOKEN, grantType)) {
////				return chain.filter(exchange);
////			}
////
////			// 3. 前端加密密文解密逻辑
////			Class inClass = String.class;
////			Class outClass = String.class;
////			ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders);
////
////			// 4. 解密生成新的报文
////			Mono<?> modifiedBody = serverRequest.bodyToMono(inClass).flatMap(decryptAES());
////
////			BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, outClass);
////			HttpHeaders headers = new HttpHeaders();
////			headers.putAll(exchange.getRequest().getHeaders());
////			headers.remove(HttpHeaders.CONTENT_LENGTH);
////
////			headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
////			CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers);
////			return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> {
////				ServerHttpRequest decorator = decorate(exchange, headers, outputMessage);
////				return chain.filter(exchange.mutate().request(decorator).build());
////			}));
//			return chain.filter(exchange);
//		};
//	}
//
////	/**
////	 * 原文解密
////	 * @return
////	 */
////	private Function decryptAES() {
////		return s -> {
////			// 构建前端对应解密AES 因子
////			AES aes = new AES(Mode.CFB, Padding.NoPadding,
////					new SecretKeySpec(gatewayConfig.getEncodeKey().getBytes(), KEY_ALGORITHM),
////					new IvParameterSpec(gatewayConfig.getEncodeKey().getBytes()));
////
////			// 获取请求密码并解密
////			Map<String, String> inParamsMap = HttpUtil.decodeParamMap((String) s, CharsetUtil.CHARSET_UTF_8);
////			if (inParamsMap.containsKey(PASSWORD)) {
////				String password = aes.decryptStr(inParamsMap.get(PASSWORD));
////				// 返回修改后报文字符
////				inParamsMap.put(PASSWORD, password);
////			}
////			else {
////				log.error("非法请求数据:{}", s);
////			}
////			return Mono.just(HttpUtil.toParams(inParamsMap, Charset.defaultCharset(), true));
////		};
////	}
////
////	/**
////	 * 报文转换
////	 * @return
////	 */
////	private ServerHttpRequestDecorator decorate(ServerWebExchange exchange, HttpHeaders headers,
////			CachedBodyOutputMessage outputMessage) {
////		return new ServerHttpRequestDecorator(exchange.getRequest()) {
////			@Override
////			public HttpHeaders getHeaders() {
////				long contentLength = headers.getContentLength();
////				HttpHeaders httpHeaders = new HttpHeaders();
////				httpHeaders.putAll(super.getHeaders());
////				if (contentLength > 0) {
////					httpHeaders.setContentLength(contentLength);
////				}
////				else {
////					httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
////				}
////				return httpHeaders;
////			}
////
////			@Override
////			public Flux<DataBuffer> getBody() {
////				return outputMessage.getBody();
////			}
////		};
////	}
//
//}
